package Negocio;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Vector;

import Controlador.Utils;
import Persistencia.AdmPersistenciaLote;
import Persistencia.AdmPersistenciaLoteCompuesto;

public class LoteCompuesto extends Lote{
	
	Collection <Lote> lotesComponentes;
	
	public LoteCompuesto(Long codigo,ItemMineral minPrin,String tipo,Collection <ItemMineral> minCompo,Collection<Lote> loteComp, double area,Propietario prop, String estado){
		super(codigo,minPrin,tipo,minCompo,area,prop,estado);
		lotesComponentes = loteComp;
	}
	
	public static LoteCompuesto getLote(Propietario prop, Vector<Lote> lc) {
		Collection <ItemMineral> it = obtenerMinerales(lc);
		ItemMineral item = obtenerMineralPrincipal(it);
		LoteCompuesto l = new LoteCompuesto(Utils.CONSTANTE_LONG_SIN_USO, item, Utils.CONSTANTE_LOTE_COMPUESTO, it,lc, obtenerAreaSiembra(lc), prop, Utils.CONSTANTE_ACTIVO);
		l.insert();
		return l;
	}
	private static double obtenerAreaSiembra(Collection<Lote> lc) {
		Double siembra = 0.0;
		for(Lote l:lc){
			siembra = siembra + l.getAreaSiembra();
		}
		return siembra;
		
	}

	private static Collection<ItemMineral> obtenerMinerales (Collection <Lote> lotesComponentes){
				
		System.out.println("Log: LoteCompuesto.seteraMineralPrincipal.... [Inicio]");
		
		System.out.println("Log: Cargando Mapa de ItemMineral...");
		HashMap<Mineral, Double> mapa = new HashMap<Mineral, Double>();
		Double porcen = 0.0;
		for (Lote lote: lotesComponentes){
			ItemMineral i = lote.getMineralPrincipal();
			Mineral m = i.getMineral();
			porcen = mapa.get(m);
			if(porcen==null){
				porcen = i.getPorcentaje();
			}else{
				porcen = porcen + i.getPorcentaje();
			}
			mapa.put(m, porcen);
			
		}
		
		Collection<ItemMineral> res = new Vector<ItemMineral>();
		
		Iterator<Map.Entry<Mineral,Double>> it = mapa.entrySet().iterator();
		Map.Entry<Mineral,Double> e;
		
		System.out.println("Log: Obteniendo ItemMineral de mayor porcentaje...");
		
		while (it.hasNext()){
			e = (Map.Entry<Mineral,Double>)it.next();
			res.add(new ItemMineral(Utils.CONSTANTE_INT_SIN_USO,e.getKey(),e.getValue(),Utils.CONSTANTE_LONG_SIN_USO,""));	
		}
		
		System.out.println("Log: LoteCompuesto.seteraMineralPrincipal.... [Fin]");
		return res;

	}
	
	private static ItemMineral obtenerMineralPrincipal (Collection<ItemMineral> it){
		
		double porcen = 0.0;
		ItemMineral item = null;
		for (ItemMineral i : it){
			if (porcen < i.getPorcentaje()){
				porcen = i.getPorcentaje();
				item = i;
			}
		}
		if (item!=null){
			it.remove(item);
		}
		return item;
	}
	
	public Collection<Lote> getLotesComponentes() {
		return lotesComponentes;
	}

	public void setLotesComponentes(Collection<Lote> lotesComponentes) {
		this.lotesComponentes = lotesComponentes;
	}

	@Override
	public LoteCompuestoView getView() {
		return new LoteCompuestoView(this);
	}

	@Override
	public void insert() {
		Long codigo = AdmPersistenciaLoteCompuesto.getInstancia().insertar(this);
		setCodigo(codigo);
		ItemMineral i = getMineralPrincipal();
		i.setNroLote(codigo);
		i.insert();
		for(ItemMineral it:getMineralesComponentes()){
			it.getCodigo();
			it.insert();
		}
		AdmPersistenciaLote.getInstancia().asignarLoteComponente(this.getCodigo(),this.getLotesComponentes());
		
	}

	@Override
	public void update() {
		
		AdmPersistenciaLoteCompuesto.getInstancia().modificar(this);
		setMineralesComponentes(obtenerMinerales(this.lotesComponentes));
		ItemMineral i = obtenerMineralPrincipal(this.getMineralesComponentes());
		i.insert();
		for(ItemMineral it : getMineralesComponentes()){
			it.insert();
		}
		
	}

	@Override
	public void delete() {
		AdmPersistenciaLote.getInstancia().desasignarLoteComponente(this.getCodigo(), this.lotesComponentes);		
		AdmPersistenciaLoteCompuesto.getInstancia().borrar(this);
		
	}

	
}
